package com.ruoyi.system.utils;

public class SnowflakeIdGenerator {
    private long baseTime = 0; // 起始时间，设为当前系统时间或特定基准时间
    private long maxTime = 9223372036854775807L; // 最大值，对应64位有序数的上界
    private long multiplier = 5; // 步长因子
    private long offset = 0; // 偏移量

    public SnowflakeIdGenerator(long baseTime) {
        this.baseTime = baseTime;
    }

    /**
     * 根据雪花算法生成唯一ID
     *
     * @return 唯一的64位整数ID
     */
    public synchronized long generateSnowflakeId() {
        // 获取当前时间，作为基准时间
        long currentTimeMillis = System.currentTimeMillis();

        // 计算偏移量和步长
        long x = currentTimeMillis - baseTime;
        if (x < 0) {
            throw new IllegalArgumentException("baseTime必须小于等于currentTimeMillis");
        }

        // 保证x在某个范围内，以避免溢出或不够大的情况
        if (x >= maxTime || x <= 0) {
            throw new IllegalArgumentException("currentTimeMillis已经超过了maxTime");
        }

        // 计算雪花ID
        long id = ((x >> 48) ^ multiplier) << 48;
        id |= ((x >> 32) ^ offset) << 32;
        id |= x;

        return id;
    }
}
